/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package es.uv.bd.model;

import static es.uv.bd.model.VinosDAO.DBURL;
import static es.uv.bd.model.VinosDAO.DRIVER;
import static es.uv.bd.model.VinosDAO.PASSWORD;
import static es.uv.bd.model.VinosDAO.USERNAME;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Bepitic
 */
public class VinosDAO {
      
    /*
     * Parámetros de conexión a la base de datos
     */
    public static final String DRIVER = "oracle.jdbc.OracleDriver";
    public static final String DBURL = "jdbc:oracle:thin:@pokemon2.uv.es:1521:ORCL";
    public static final String USERNAME = "AL001";
    public static final String PASSWORD = "AL001";

    private static final String CREATE = 
            "INSERT INTO vino (NOMBRE, Cod_bodega, Nombre_tipo,  Clasificacion) " +
            "VALUES (?,?,?,?)";
    
    private static final String READ = 
            "SELECT NOMBRE, Cod_bodega, Nombre_tipo, Clasificacion"+
            "  FROM VINO " +
            " WHERE NOMBRE = ?";
    
    
    /* Hacer Los cambios pertinentes */
    
    private static final String READALL =  
            "SELECT vin.nombre, vin.COD_BODEGA,vin.Nombre_tipo, vin.clasificacion, b.NOMBRE AS NOMBRE_B, b.PAIS, b.NOMBRE_DEN_O, b.EMAIL, b.ANYO, b.REGION, b.WEB, b.TELEFONO, b.CODIGO_POSTAL, b.DIRECCION, b.ENOLOGO "+
            " FROM BODEGA b join Vino vin on b.COD_BODEGA = vin.COD_BODEGA" +
            " " +
            " ORDER BY b.cod_bodega";
    
        private static final String FK_key_Bod = 
            "SELECT b.COD_BODEGA "+
            " FROM BODEGA b " +
            " " +
            " ORDER BY b.COD_BODEGA";
        
        private static final String FK_key_Tipo = 
            "SELECT b.NOMBRE "+
            " FROM TIPO_VINO b " +
            " " +
            " ORDER BY b.NOMBRE ";
    
    private static final String UPDATE =
            "UPDATE vino " +
            "   SET  Cod_bodega= ?, Nombre_tipo= ?, Clasificacion= ?" +
            " WHERE NOMBRE = ?";
    
    private static final String DELETE =
            "DELETE FROM vino " +
            " WHERE NOMBRE = ?";
    
    
        public String[] fk_Key_BOD(){
        
    // DefaultTableModel tablaBodega= new DefaultTableModel();
        ArrayList<String> key = new ArrayList<String>();
       
            
        try {
            /*
            * Conexion a la base de datos
            */
            Class.forName(DRIVER).newInstance();
            Connection oracleConn = DriverManager.getConnection(DBURL,USERNAME,PASSWORD);
            PreparedStatement s = oracleConn.prepareStatement(FK_key_Bod);
            ResultSet rs = s.executeQuery();
            
            while (rs.next()) {
                key.add(rs.getString("COD_BODEGA"));
            }
            oracleConn.close();
        }
        catch (ClassNotFoundException | InstantiationException | IllegalAccessException | SQLException e) {
            System.out.println("VinosDAO::getString[]KEY_bod -- " + e.getMessage());
        }
        finally {
            String[] fk = new String[key.size()] ;
            fk = key.toArray(fk);
            
            
            return fk;
        }
    }
   
        public String[] fk_Key_TIPO(){
        
        ArrayList<String> key = new ArrayList<String>();
            
        try {
            /*
            * Conexion a la base de datos
            */
            Class.forName(DRIVER).newInstance();
            Connection oracleConn = DriverManager.getConnection(DBURL,USERNAME,PASSWORD);
            PreparedStatement s = oracleConn.prepareStatement(FK_key_Tipo);
            ResultSet rs = s.executeQuery();
          
            while (rs.next()) {
                key.add(rs.getString("NOMBRE"));      
            }
            oracleConn.close();
        }
        catch (ClassNotFoundException | InstantiationException | IllegalAccessException | SQLException e) {
            System.out.println("BodegasDAO::getString[]KEY_Tipo -- " + e.getMessage());
        }
        finally {
            String[] fk = new String[key.size()] ;
            fk = key.toArray(fk);
            
            
            return fk;
        }
    }
   
    
    
    public void crearVinos(Vinos vino) throws 
            ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
        
        /*
        * Conexion a la base de datos
        */
        Class.forName(DRIVER).newInstance();
        Connection oracleConn = DriverManager.getConnection(DBURL,USERNAME,PASSWORD);
        oracleConn.setAutoCommit(false);
        // Sentencia de insert
        
        PreparedStatement insert = oracleConn.prepareStatement(CREATE);
        
        insert.setString(1, vino.getNombre());
        insert.setInt(2, vino.getCod_Bodega());
        insert.setString(3, vino.getNombre_tipo());
        insert.setString(4, vino.getClasificacion());
     
        insert.executeUpdate();
        
        oracleConn.commit();
        oracleConn.setAutoCommit(true);
        oracleConn.close();
    }
    
    public Vinos leerVinos(String nombre) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException, ParseException {
        
        Vinos bod = new Vinos();
      
        Class.forName(DRIVER).newInstance();
        Connection oracleConn = DriverManager.getConnection(DBURL,USERNAME,PASSWORD);
           
        // Sentencia de insert
        PreparedStatement read = oracleConn.prepareStatement(READ);
        read.setString(1, nombre);
        ResultSet rs = read.executeQuery();
        
        if (rs.next()) {
            
          
            bod.setNombre(rs.getString("NOMBRE"));
            bod.setCod_Bodega(rs.getInt("Cod_bodega"));
            bod.setNombre_tipo(rs.getString("Nombre_tipo"));
            bod.setClasificacion(rs.getString("Clasificacion"));
            
        }
        return bod;
    }
    
    public void actualizarVinos(Vinos bode) throws ClassNotFoundException, 
           InstantiationException, IllegalAccessException, SQLException {
           
        /*
        * Conexion a la base de datos
        */
        Class.forName(DRIVER).newInstance();
        Connection oracleConn = DriverManager.getConnection(DBURL,USERNAME,PASSWORD);
           
        oracleConn.setAutoCommit(false);
        // Sentencia de insert
        PreparedStatement update = oracleConn.prepareStatement(UPDATE);
        update.setInt(1, bode.getCod_Bodega());
        update.setString(2, bode.getNombre_tipo());
        update.setString(3, bode.getClasificacion());
        update.setString(4, bode.getNombre());
        
        update.executeUpdate();
        oracleConn.commit();
        oracleConn.setAutoCommit(true);
        oracleConn.close();
    }
    
    public void borrarVinos(String nombre) throws ClassNotFoundException, 
           InstantiationException, IllegalAccessException, SQLException {
        /*
        * Conexion a la base de datos
        */
        Class.forName(DRIVER).newInstance();
        Connection oracleConn = DriverManager.getConnection(DBURL,USERNAME,PASSWORD);
            
        oracleConn.setAutoCommit(false);
        
        // Sentencia de borrado
        PreparedStatement delete = oracleConn.prepareStatement(DELETE);
        delete.setString(1, nombre);
        delete.executeUpdate();
        
        oracleConn.commit();
        oracleConn.setAutoCommit(true);
        oracleConn.close();
    }

    public DefaultTableModel getTablaVinos() {
        
        DefaultTableModel tablaVino= new DefaultTableModel();
        
        try {
            /*
            * Conexion a la base de datos
            */
            Class.forName(DRIVER).newInstance();
            Connection oracleConn = DriverManager.getConnection(DBURL,USERNAME,PASSWORD);
            
            PreparedStatement s = oracleConn.prepareStatement(READALL);
            ResultSet rs = s.executeQuery();
            ResultSetMetaData rsMd = rs.getMetaData();
            //La cantidad de columnas que tiene la consulta
            int numeroColumnas = rsMd.getColumnCount();
            //Establecer como cabezeras el nombre de las colimnas
            for (int i = 1; i <= numeroColumnas; i++) {
                tablaVino.addColumn(rsMd.getColumnLabel(i));
            }
            //Creando las filas para el JTable
            while (rs.next()) {
                Object[] fila = new Object[numeroColumnas];
                
                fila[ 0 ] = rs.getString("NOMBRE");
                fila[ 1 ] = rs.getInt("Cod_Bodega");
                fila[ 2 ] = rs.getString("Nombre_tipo");
                fila[ 3 ] = rs.getString("clasificacion");
                
                fila[ 4 ] = rs.getString("NOMBRE_B");
                fila[ 5 ] = rs.getString("PAIS");
                fila[ 6 ] = rs.getString("NOMBRE_DEN_O");
                fila[ 7 ] = rs.getString("EMAIL");
                fila[ 8 ] = rs.getInt("ANYO");
                fila[ 9 ] = rs.getString("REGION");
                fila[ 10 ] = rs.getString("WEB");
                fila[ 11 ] = rs.getInt("TELEFONO");
                fila[ 12 ] = rs.getInt("CODIGO_POSTAL");
                fila[ 13 ] = rs.getString("DIRECCION");
                fila[ 14 ] = rs.getString("ENOLOGO");
                tablaVino.addRow(fila);
            }
            oracleConn.close();
        }
        catch (ClassNotFoundException | InstantiationException | IllegalAccessException | SQLException e) {
            System.out.println("VinosDAO::getTablaMascotas -- " + e.getMessage());
        }
        finally {
            return tablaVino;
        }
    }
}

    


    

